/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package valida.Recursos;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.derby.drda.NetworkServerControl;
import valida.Util.PropiedadesDB;

/**
 *
 * @author Andres.florez
 */
public class AdministradorBaseDatos {
    private static Connection conn;
    private static boolean ServidorIniciado=false;
    private static boolean BDCreada=false;

    private static boolean iniciarBaseDatos(){      

        try{
            Class.forName(PropiedadesDB.DRIVER);
            if(!BDCreada){
            conn = DriverManager.getConnection(PropiedadesDB.PROTOCOLO+"//"
                    + PropiedadesDB.SERVIDOR+":"
                    + PropiedadesDB.PUERTO+"/"
                    + PropiedadesDB.NOMBREBD
                    +";create=true"
                    + ";user="+PropiedadesDB.USUARIO
                    + ";password="+PropiedadesDB.PASSWORD);
            }else{
                conn = DriverManager.getConnection(PropiedadesDB.PROTOCOLO+"//"
                    + PropiedadesDB.SERVIDOR+":"
                    + PropiedadesDB.PUERTO+"/"
                    + PropiedadesDB.NOMBREBD
                    + ";user="+PropiedadesDB.USUARIO
                    + ";password="+PropiedadesDB.PASSWORD);
            }
            seleccionarSchema();
            return true;
        }catch(SQLException e)
        {
            BDCreada=(e.getErrorCode()==-1);
            return false;

        }catch(Exception e){
            e.printStackTrace();
            return false;
        }
    }



    public synchronized static Connection getConexion(){
       //si la Conexion actual ya esta cerrada intentamos Construir una
        try {
            if (conn != null && conn.isClosed()) {
                conn = null;
            }
        } catch (Exception e) {
            conn = null;
        }
         System.gc();

         //iniciamos el Servidor Si no se ha iniciado
        while (!ServidorIniciado) {
            IniciarServidor();
        }

         //si la Conexion es nula creamos una
        if(conn==null){
            //Mientras no se tenga conexion intentamos Construir una
            while(!iniciarBaseDatos()){
                try {
                    Thread.sleep(1);
                } catch (InterruptedException ex) {
                  //No lanzamos Excepcion
                }
            }
        }
        return conn;
    }
    
    public synchronized static void reurnConexion(Connection conn){
        try {
            if (!conn.isClosed()) {
                conn.close();
                conn = null;

            }
        } catch (Exception e) {
            conn = null;
        }
        System.gc();
    }

    private static void IniciarServidor() {
        try {
            NetworkServerControl networkServerControl = new NetworkServerControl();
            networkServerControl.start(null);
            networkServerControl.logConnections(false);

            
            ServidorIniciado = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void setEstructura() {
        getConexion();
    }

    private static void seleccionarSchema() {
        try {
            PreparedStatement ps = conn.prepareStatement("SET SCHEMA ?");
            ps.setString(1, "APP");
            ps.execute();
        } catch (SQLException ex) {
            System.err.print("AdministradorBaseDatos.seleccionarSchema()" +ex.getMessage());
        }
    }

}
